Account = {
	submitting: false,
};

Account.focus = function() {
	var x = $('input[name="login"]');
	if ((x.length <= 0) || x[0].disabled) x = $('input[name="onoma"]');
	x.focus().val(x.val());
}

// Check Login Online

Account.clo = {
	timer: null,

	check: function(e, fld) {
		if (Client.controlKey(e)) return;
		if (Account.clo.timer) clearTimeout(Account.clo.timer);
		Account.clo.timer = setTimeout(function() { Account.clo.checkNow(fld); }, 200);
	},

	checkNow: function(fld) {
		if (!Account.valid.login(fld)) return;
		Client.fyi.pano();

		Client.ajax('account/diathesimotita', 'login=' + fld.value.uri(), function(rsp) {
			Client.fyi.epano(rsp);
			$(fld).formaLathos(rsp);
		});
	}
};

Account.valid = {
	login: function(fld) {
		fld.value = fld.value.trim();
		if (fld.value === '') {
			Client.fyi.epano('Το login name είναι υποχρεωτικό');
			$(fld).formaLathos(true);
			return false;
		}

		if (!fld.value.validLogin()) {
			Client.fyi.epano('Το login name δεν είναι δεκτό');
			$(fld).formaLathos(true);
			return false;
		}

		$(fld).formaLathos();
		return true;
	},

	onoma: function(fld) {
		fld.value = fld.value.trim();
		if (fld.value === '') {
			Client.fyi.epano('Το ονοματεπώνυμο είναι υποχρεωτικό');
			$(fld).formaLathos(true);
			return false;
		}

		$(fld).formaLathos();
		return true;
	},

	email: function(fld) {
		fld.value = fld.value.trim();
		if (fld.value === '') {
			$(fld).formaLathos();
			return true;
		}

		if (fld.value.validEmail()) {
			$(fld).formaLathos();
			return true;
		}

		Client.fyi.epano('Το email δεν είναι δεκτό');
		$(fld).formaLathos(true);
		return false;
	},

	kodikos: function(form) {
		if (form.kodikos2.value === form.kodikos1.value) {
			$(form.kodikos1).formaLathos();
			return true;
		}

		Client.fyi.epano('Διαφορετικοί κωδικοί');
		$(form.kodikos1).formaLathos(true);
		return false;
	},

	kodikosExists: function(form) {
		if (form.kodikos2.value !== '') {
			$(form.kodikos2).formaLathos();
			return true;
		}

		Client.fyi.epano('Ο κωδικός δεν μπορεί να είναι κενός');
		$(form.kodikos2).formaLathos(true);
		return false;
	},
};

Account.reset = function() {
	$('.formaLathos').removeClass('formaLathos');
	Account.photo.epanafora();
	Account.paraskinio.epanafora();
	Account.focus();
	setTimeout(function() {
		$('.profinfoInfoPektis').html($('#profinfoEditArea').find('textarea').val());
	}, 10);
	return true;
}

Account.akiro = function() {
	if (Client.isPektis()) window.self.close();
	else window.location = Client.server;
}

Account.egrafi = function(form) {
	if (!Account.valid.login(form.login)) return Account.lathosPedio(form.login);
	if (!Account.valid.onoma(form.onoma)) return Account.lathosPedio(form.onoma);
	if (!Account.valid.email(form.email)) return Account.lathosPedio(form.email);
	if (!Account.valid.kodikos(form)) return Account.lathosPedio(form.kodikos1);
	if (!Account.valid.kodikosExists(form)) return Account.lathosPedio(form.kodikos1);
	Account.paraskinio.trexonSet();

	if (Account.submitting) return false;
	Account.submitAllow(false);

	Client.fyi.pano('Δημιουργία λογαριασμού. Παρακαλώ περιμένετε…');
	return true;
}

Account.enimerosi = function(form) {
	if (Account.submitting) return false;

	if (!Account.valid.login(form.login)) return Account.lathosPedio(form.login);
	if (!Account.valid.onoma(form.onoma)) return Account.lathosPedio(form.onoma);
	if (!Account.valid.email(form.email)) return Account.lathosPedio(form.email);
	Account.paraskinio.trexonSet();

	// Κάνουμε στα γρήγορα έναν αρχικό έλεγχο όσον αφορά στην ορθότητα των
	// στοιχείων εισόδου. Αν ο έλεγχος αυτός αποτύχει δεν προχωρούμε με το
	// submit.

	var rsp = Client.ajax('account/prosvasi', 'login=' + form.login.value.uri(),
		'kodikos=' + form.kodikos.value.uri(), false);
	if (rsp) {
		$(form.kodikos).addClass('formaLathos');
		Account.lathosPedio(form.kodikos, rsp);
		return false;
	}

	Account.submitAllow(false);
	Client.fyi.pano('Ενημέρωση στοιχείων λογαριασμού. Παρακαλώ περιμένετε…');
	return true;
}

// Ακολουθεί μέθοδος διαχείρισης του περιεχομένου του iframe στο οποίο προβάλλεται
// η σελίδα διαχείρισης των δεδομένων της φόρμας. Κανονικά πρέπει να περιέχεται μόνο
// ένα string της μορφής "{pektis: 'XXXXXXX', klidi: 'XXXXXXXXXX'}" με τα στοιχεία
// της νέας συνεδρίας, συνοδευόμενο από το string "@EOD@" και εντολές javascript
// μέσω των οποίων καλείται αυτή καθεαυτή η μέθοδος "checkinCheck" στο parent
// window, δηλαδή στη βασική σελίδα της ενημέρωσης των στοιχείων λογαριασμού.
// Αν δεν αναγνωριστεί το παραπάνω format, τότε σημαίνει ότι κάτι δεν πήγε καλά.

Account.checkinCheck = function() {
	// Λαμβάνουμε το text περιεχόμενο της σελίδας
	// διαχείρισης των δεδομένων της φόρμας.
	var x = $('[name="checkin"]').contents().text();
	if (!x) return;

	// Πριν από το "@EOD@" πρέπει να υπάρχει string της μορφής
	// "{pektis: 'XXXXXXX', klidi: 'XXXXXXXXXX'}". Αν δεν είναι
	// έτσι τα πράγματα, σημαίνει ότι κάτι δεν πήγε καλά.

	x = x.split('@EOD@');
	try {
		eval('var lk = ' + x[0] + ';');
	} catch(e) {
		Client.fyi.epano(x[0]);
		Account.lathosPedio($('input[name="kodikos"]').addClass('formaLathos'));
		Account.submitAllow();
		return;
	}

	// Επεστράφησαν τα επιθυμητά δεδομένα, επομένως προχωρούμε στις
	// διαδικασίες ενημέρωσης των στοιχείων του λογαριασμού και
	// σε αλλαγή σελίδας.

	Account.photo.refresh();

	// Αν έχουμε επώνυμη χρήση, τότε σημαίνει ότι έχουμε ενημέρωση στοιχείων
	// ήδη υπάρχοντος λογαριασμού, επομένως ενημερώνουμε το σκηνικό του server
	// και κλείνουμε το παράθυρο ενημέρωσης των στοιχείων λογαριασμού.

	if (Client.isPektis()) {
		Account.skinikoRefresh(function() {
			window.close();
		});
		return;
	}

	// Πρόκειται για νέα εγγραφή, επομένως θα πρέπει να ενημερώσουμε το
	// σκηνικό του server και κατ' επέκτασιν των clients με την νέα συνεδρία.
	// Επειδή οι κλήσεις στον Node server γίνονται με τα στοιχεία του
	// τρέχοντος παίκτη, ενημερώνουμε πρόχειρα τις σχετικές μεταβλητές
	// ώστε να μπορέσουμε να περάσουμε τον έλεγχο ασφαλείας.

	Client.isodos(lk.pektis, lk.klidi, function(pektis, klidi) {
		Client.session.pektis = pektis;
		Client.session.klidi = klidi;
		Account.skinikoRefresh(function() {
			window.location = Client.server;
		});
	}, function() {
		form.onoma.focus();
		Account.submitAllow();
	});
}

// Η μέθοδος "skinikoRefresh" σκοπό έχει την ενημέρωση του σκηνικού στον
// server και συνεπώς και στους clients.

Account.skinikoRefresh = function(callback) {
	Client.node('pektisRefresh', function(rsp) {
		if (rsp) Client.fyi.epano(rsp);
		else callback();
		Account.submitAllow();
	});
}

Account.lathosPedio = function(fld, msg) {
	if (msg) Client.fyi.spano(msg);
	else Client.sound.error();
	fld.focus();
	return false;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.paraskinio = {};

Account.paraskinio.setup = function() {
	var x = $('input[name="paraskinio"]');
	if (Client.session.paraskinio) x.val(Client.session.paraskinio);
	Account.paraskinio.arxiko = x.val();
}

Account.paraskinio.anionta = function(img) {
	for (var w = window; w; w = w.opener) {
		try {
			$(w.document.body).paraskinio(img);
			w.Client.session.paraskinio = img;
		} catch(e) { continue; }
	}
}

Account.paraskinio.epanafora = function() {
	Account.paraskinio.anionta(Account.paraskinio.arxiko);
	Client.setCookie('paraskinio', Account.paraskinio.arxiko);
}

Account.paraskinio.trexonSet = function() {
	$('input[name="paraskinio"]').val(Client.session.paraskinio);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.kodikos = {};

Account.kodikos.setup = function() {
	if (Client.isPektis()) {
		$('#kodikos').css({display: 'table-row'});
	}
	else {
		$('#kodikos1').css({visibility: 'visible'});
		$('#kodikos2').css({visibility: 'visible'});
	}
}

Account.kodikos.alagi = function(div) {
	$(div).parent().html('Νέος κωδικός');
	$('#kodikos1').css({visibility: 'visible'});
	$('#kodikos2').css({visibility: 'visible'});
	$('input[name="kodikos1"]').focus();
	return false;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.photo = {};

Account.photo.select = function() {
	$('input[name="photoFile"]').click();
}

Account.photo.change = function(fld) {
	if (!fld.files[0]) return;

	try {
		if (fld.files[0].size > Account.photo.maxSize) {
			Client.fyi.epano('Υπέρβαση ορίου μεγέθους φωτογραφίας (' + fld.files[0].size +
				' > ' + Account.photo.maxSize + ')', null, true);
			return;
		}
		Account.photo.setEnergia('alagi');
		Account.photo.showEpanafora(true);
		var nea = window.URL.createObjectURL(fld.files[0]);
		$('#photo').attr({src: nea});
		window.URL.revokeObjectURL(nea);
	} catch(e) {
		Account.photo.setEnergia('alagi');
		Account.photo.showEpanafora(true);
		Client.fyi.epano('Ο browser που χρησιμοποιείτε δεν έχει δυνατότητα προεπισκόπησης');
	}
}

Account.photo.diagrafi = function(fld) {
	Account.photo.setEnergia('diagrafi');
	$('#photo').attr({src: Client.missingPhoto});
	Account.photo.clearFile();
	Account.photo.showEpanafora(true);
}

Account.photo.epanafora = function(fld) {
	Account.photo.clearFile();
	Account.photo.showEpanafora(false);
	switch (Account.photo.getEnergia()) {
	case 'alagi':
	case 'diagrafi':
		break;
	default:
		return;
	}

	Account.photo.setEnergia();
	var crs = Client.pektisPhotofile(Client.session.pektis, true);
	$('#photo').attr({src: crs});
}

Account.photo.setEnergia = function(energia) {
	$('input[name="photoEnergia"]').val(energia);
}

Account.photo.getEnergia = function(energia) {
	return $('input[name="photoEnergia"]').val();
}

Account.photo.showDiagrafi = function(yes) {
	$('#photoDiagrafi').css({visibility: yes ? 'visible' : 'hidden'});
}

Account.photo.showEpanafora = function(yes) {
	$('#photoEpanafora').css({visibility: yes ? 'visible' : 'hidden'});
}

Account.photo.clearFile = function() {
	$('input[name="photoFile"]').val('');
}

Account.photo.setup = function() {
	$('<img id="photo" class="pektisPhoto" />').on('load', function() {
		Account.photo.showDiagrafi(this.src != Client.missingPhoto);
	}).on('error', function() {
		this.src = Client.missingPhoto;
		Account.photo.showEpanafora(false);
	}).attr('src', Client.pektisPhotofile(Client.session.pektis, true)).
		appendTo($('.pektisPhotoContainer'));
}

// Εξαναγκάζουμε τους προπάτορες σε επαναφόρτωση των φωτογραφιών προφίλ των
// παικτών όταν αυτές επανεμφανιστούν. Ξεκινάμε από το parent window καθότι
// η μέθοδος καλείται μέσα από το iframe υποδοχής των αποτελεσμάτων και
// ανεβαίνουμε τους προπάτορες μέχρι την αρχική σελίδα.

Account.photo.refresh = function() {
	for (var w = window.parent; w; w = w.opener) {
		try { w.Client.pektisPhotoRefresh(); } catch(e) { continue; }
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.simetoxi = {};

Account.simetoxi.setup = function() {
	$('#simetoxi').siromeno({
		display: Client.isPektis() ? 'none' : 'inline',
		whiteSpace: 'normal'
	}).pineza(2000).find('a').siromeno(false);
}

Account.simetoxi.onOff = function() {
	var x = $('#simetoxi');
	if (!x.length) return false;

	x.find('.pinezaPineza').remove();
	if (x.css('display') == 'none') {
		x.fadeIn(200);
		return false;
	}

	x.stop();
	if (x.css('opacity') < 1) x.fadeTo(200, 1);
	else x.fadeOut(200);

	return false;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.profinfo = {};

Account.profinfo.setup = function() {
	$('#profinfoEditArea').siromeno().pineza().find('textarea,button').siromeno(false);
	$('#profinfoEditArea').find('textarea').on('click', function(e) {
		$(this).parent().parent().anadisi();
	}).on('keyup', function() {
		$('.profinfoInfoPektis').html($(this).val());
	}).on('cut paste', function() {
		var obj = $(this);
		setTimeout(function() {
			$('.profinfoInfoPektis').html(obj.val());
		}, 10);
	});
	$('.profinfoBox').siromeno().pineza().css({
		display: 'none',
		top: '-20px',
		left: '590px',
	});
}

Account.profinfo.preview = function(e) {
	Client.stopProp(e);
	var x = $('.profinfoBox');
	if (!x.length) return;

	if (x.css('display') == 'none') x.fadeIn().anadisi();
	else x.fadeOut();
}

Account.profinfo.reset = function(e) {
	Client.stopProp(e);
	return true;
}

// Η μέθοδος που ακολουθεί θα μπορούσε να είναι ένα απλό fadeToggle,
// αλλά κάνουμε προσπάθεια να τοποθετήσουμε τον κέρσορα στο τέλος.

Account.profinfo.toggle = function(e) {
	Client.stopProp(e);
	var x = $('#profinfoEditArea');
	if (!x.length) return;

	if (x.css('display') != 'none') {
		x.fadeOut();
		Account.focus();
		return;
	}

	var t = x.find('textarea').prop({disabled: false});
	var s = t.val();
	x.fadeIn().anadisi();
	t.focus().val('').val(s);
}

Account.profinfo.klisimo = function(e) {
	Client.stopProp(e);
	Account.profinfo.edit();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.katastasi = {};

Account.katastasi.setup = function() {
	$('<img>').attr({id: 'katastasiIcon'}).addClass('iconButton formaIconButton').attr({
		src: Account.katastasi.ikona(),
		title: $('select[name="katastasi"]').attr('title'),
	}).on('click', function() {
		Account.katastasi.alagi();
	}).appendTo($('#postelContainer'));
	$('select[name="katastasi"]').on('change', function() {
		$('#katastasiIcon').attr({src: Account.katastasi.ikona()});
	});
}

Account.katastasi.ikona = function() {
	switch ($('select[name="katastasi"]').val()) {
	case 'ΑΠΑΣΧΟΛΗΜΕΝΟΣ': var x = 'apasxolimenos'; break;
	default: x = 'diathesimos'; break;
	}

	return '../images/cpanel/' + x + '.png';
}

Account.katastasi.alagi = function(src) {
	var input = $('select[name="katastasi"]');
	if (!input.length) return;

	switch (input.val()) {
	case 'ΔΙΑΘΕΣΙΜΟΣ':
		var timi = 'ΑΠΑΣΧΟΛΗΜΕΝΟΣ';
		var raw = 'B';
		break;
	default:
		timi = 'ΔΙΑΘΕΣΙΜΟΣ';
		raw = 'A';
		break;
	}

	// Η αλλαγή κατάστασης δεν απαιτεί ενημέρωση για εφαρμογή. Ενημερώνεται άμεσα
	// η παράμετρος στην database και εφόσον η ενημέρωση είναι επιτυχής, ενημερώνεται
	// και το σκηνικό στον server.

	Account.setPeparam('ΚΑΤΑΣΤΑΣΗ', 'katastasi', timi, raw, input);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.asoi = {};

Account.asoi.setup = function() {
	$('<img>').attr({id: 'asoiIcon'}).addClass('iconButton formaIconButton').attr({
		src: Account.asoi.ikona(),
		title: $('input[name="asoi"]').attr('title'),
	}).on('click', function() {
		Account.asoi.alagi();
	}).appendTo($('#postelContainer'));
	$('input[name="asoi"]').on('change', function() {
		$('#asoiIcon').attr({src: Account.asoi.ikona()});
	});
}

Account.asoi.ikona = function() {
	return '../images/cpanel/asoi' + ($('input[name="asoi"]').prop('checked') ? 'On' : 'Off') + '.png';
}

Account.asoi.alagi = function(src) {
	$('input[name="asoi"]').click();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.paso = {};

Account.paso.setup = function() {
	$('<img>').attr({id: 'pasoIcon'}).addClass('iconButton formaIconButton').attr({
		src: Account.paso.ikona(),
		title: $('input[name="paso"]').attr('title'),
	}).on('click', function() {
		Account.paso.alagi();
	}).appendTo($('#postelContainer'));
	$('input[name="paso"]').on('change', function() {
		$('#pasoIcon').attr({src: Account.paso.ikona()});
	});
}

Account.paso.ikona = function() {
	return '../images/cpanel/paso' + ($('input[name="paso"]').prop('checked') ? 'On' : 'Off') + '.png';
}

Account.paso.alagi = function(src) {
	$('input[name="paso"]').click();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.postel = {};

Account.postel.setup = function() {
	$('<img>').attr({id: 'postelIcon'}).addClass('iconButton formaIconButton').attr({
		src: Account.postel.ikona(),
		title: $('select[name="postel"]').attr('title'),
	}).on('click', function() {
		Account.postel.alagi();
	}).appendTo($('#postelContainer'));
	$('select[name="postel"]').on('change', function() {
		$('#postelIcon').attr({src: Account.postel.ikona()});
	});
}

Account.postel.ikona = function() {
	switch ($('select[name="postel"]').val()) {
	case 'ΑΝΙΣΟΡΡΟΠΟ': var x = 'anisoropo'; break;
	case 'ΔΙΚΑΙΟ': x = 'dikeo'; break;
	default: x = 'kanoniko'; break;
	}

	return '../images/cpanel/postel/' + x + '.png';
}

Account.postel.alagi = function(src) {
	var x = $('select[name="postel"]');
	if (!x.length) return;

	switch (x.val()) {
	case 'ΚΑΝΟΝΙΚΟ': x.val('ΑΝΙΣΟΡΡΟΠΟ'); break;
	case 'ΑΝΙΣΟΡΡΟΠΟ': x.val('ΔΙΚΑΙΟ'); break;
	default: x.val('ΚΑΝΟΝΙΚΟ');
	}

	$('#postelIcon').attr({src: Account.postel.ikona()});
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.plati = {};

Account.plati.setup = function() {
	$('<img>').attr({id: 'platiIcon'}).addClass('iconButton formaIconButton').attr({
		src: Account.plati.ikona(),
		title: $('select[name="plati"]').attr('title'),
	}).on('click', function() {
		Account.plati.alagi();
	}).appendTo($('#postelContainer'));
	$('#postelContainer').css({display: 'inline'});
	$('#postelContainer').children('img').css({bottom: '26px'});
	$('select[name="plati"]').on('change', function() {
		$('#platiIcon').attr({src: Account.plati.ikona()});
	});
}

Account.plati.ikona = function() {
	switch ($('select[name="plati"]').val()) {
	case 'ΚΟΚΚΙΝΟ': var x = 'RV'; break;
	case 'ΤΥΧΑΙΟ': x = 'NV'; break;
	default: x = 'BV'; break;
	}

	return '../images/trapoula/' + x + '.png';
}

Account.plati.alagi = function(src) {
	var input = $('select[name="plati"]');
	if (!input.length) return;

	switch (input.val()) {
	case 'ΜΠΛΕ':
		var timi = 'ΚΟΚΚΙΝΟ';
		var raw = 'R';
		break;
	case 'ΚΟΚΚΙΝΟ':
		timi = 'ΤΥΧΑΙΟ';
		raw = 'N';
		break;
	default:
		timi = 'ΜΠΛΕ';
		raw = 'B';
		break;
	}

	// Η αλλαγή χρώματος πλάτης δεν απαιτεί ενημέρωση για εφαρμογή. Ενημερώνεται άμεσα
	// η παράμετρος στην database και εφόσον η ενημέρωση είναι επιτυχής, ενημερώνεται
	// και το σκηνικό στον server.

	Account.setPeparam('ΠΛΑΤΗ', 'plati', timi, raw, input);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.help = {};

Account.help.setup = function() {
	$('#help').siromeno().pineza();
}

Account.help.toggle = function(e) {
	$('#help').anadisi().fadeToggle(100);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.test = {};

Account.test.nok = true;

Account.test.toggle = function(e) {
	Account.test.nok = !Account.test.nok;
	$('img[title="Stress test"]').attr({
		src: '../images/' + (Account.test.nok ? 'cpanel/sloot.png' : 'working/fast.gif'),
	});
	Account.test.exec();
}

Account.test.exec = function() {
	if (Client.oxiPektis()) return;
	if (Account.test.nok) return;
	if ((parseInt(Math.random() * 100) % 20) < 2)
		$('#platiIcon').trigger('click');
	else
		$('#katastasiIcon').trigger('click');
	setTimeout(Account.test.exec, 100);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Account.setPeparam = function(param, icon, timi, raw, input) {
	Client.node('setPeparam', 'param=' + Prefadoros.peparamEco(param).uri(),
		'timi=' + raw.uri(), function(rsp) {
		if (rsp) return Client.fyi.epano(rsp);
		input.val(timi);

		var p = $('#' + icon + 'Icon');
		if (!p.length) return;

		p.attr({src: Account[icon].ikona()}).accountEgine(p);
	});
}

jQuery.fn.accountEgine = function(ico) {
	$('<img class="account_egine" src="../images/cpanel/apodoxi.png" />').css({
		right: ico.css('right'),
		bottom: '44px',
	}).appendTo(this.parent()).delay(300).fadeOut(200);
}

Account.submitAllow = function(nai) {
	if (nai === undefined) nai = true;
	Account.submitting = !nai;
	if (nai) $('input[type="submit"]').removeAttr('disabled');
	else $('input[type="submit"]').attr({disabled: 'disabled'});
}

$(document).ready(function() {
	Account.paraskinio.setup();
	Account.photo.setup();
	Account.profinfo.setup();
	Account.kodikos.setup();
	Account.katastasi.setup();
	Account.asoi.setup();
	Account.paso.setup();
	Account.postel.setup();
	Account.plati.setup();
	Account.simetoxi.setup();
	Account.help.setup();
	Account.focus();
});
